package com.rhino.security.service;

import com.rhino.security.vo.JwtUser;
import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

import java.io.Serializable;

/**
 * @ClassName MyPermissionEvaluator
 * @Description
 *  Spring Security为我们定义了hasPermission的两种使用方式，
 *  它们分别对应着PermissionEvaluator的两个不同的hasPermission()方法。
 *  Spring Security默认处理Web、方法的表达式处理器分别为DefaultWebSecurityExpressionHandler和DefaultMethodSecurityExpressionHandler，
 *  它们都继承自AbstractSecurityExpressionHandler，
 *  其所持有的PermissionEvaluator是DenyAllPermissionEvaluator，其对于所有的hasPermission表达式都将返回false。
 *
 *  如何自定义 hasPermission？@PreAuthorize("hasPermission
 *  所以当我们要使用表达式hasPermission时，我们需要自已手动定义SecurityExpressionHandler对应的bean定义，
 *  然后指定其PermissionEvaluator为我们自己实现的PermissionEvaluator，
 *  然后通过global-method-security元素或http元素下的expression-handler元素指定使用的SecurityExpressionHandler为我们自己手动定义的那个bean。
 *
 *  当前Spring容器中有PermissionEvaluator类型时，就不会创建DenyAllPermissionEvaluator了。
 *
 * 接下来看一个自己实现PermissionEvaluator使用hasPermission()表达式的简单示例。
 * @Author zyk
 * @Create 2021/7/12
 * @Version 1.0
 **/
@Component("myPermissionEvaluator")
public class MyPermissionEvaluator implements PermissionEvaluator {
    @Override
    public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
        //业务判断是否有权限访问
        JwtUser user=(JwtUser) authentication.getPrincipal();
        if(user.getUsername().equalsIgnoreCase("jake_j")){
            return true;
        }
        return false;
    }

    /**
     * 总是认为有权限
     */
    @Override
    public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
        return true;
    }
}
